package blog.sys.service;

import blog.sys.dao.SysFileDao;
import blog.sys.dao.UserDao;
import blog.sys.entity.SysFile;
import blog.sys.entity.User;
import org.apache.commons.codec.binary.Base64;
import org.omg.CORBA.INTERNAL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import pub.dao.GeneralDao;
import pub.web.ServletUtils;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.Date;

@Service
@Transactional(readOnly = true)
public class SettingService {

    public User onShowUserInfoSafeService(Integer userId) {
        User user;
        String sql = "SELECT u.id, u.name, u.nickname, u.info, u.avatar, u.mobile, u.sex, u.email FROM t_user u WHERE u.id = ?";
        user = generalDao.queryValue(User.class, sql, userId);
        return user;
    }

    @Transactional
    public void onUpdateAvatarFileService(String fileName, Integer userId, Integer avatar, String data) {
        SysFile sysFile = new SysFile();
        byte[] imgByteArr = Base64.decodeBase64(data);
        if (avatar != null) {
            sysFile = sysFileDao.get(avatar);
            sysFile.setContent(imgByteArr);
            sysFile.setSize(imgByteArr.length);
            sysFile.setCreateTime(new Date());
            sysFile.setName(fileName);
            // 重新生成的图片文件需要删除项目目录下的图片文件
            onDeleteFile(avatar);
        } else {
            sysFile.setContent(imgByteArr);
            sysFile.setContentType("image/jpeg");
            sysFile.setType(3);
            sysFile.setSize(imgByteArr.length);
            sysFile.setRelTable("t_user");
            sysFile.setRelId(userId);
            sysFile.setName(fileName);
            sysFile.setSeq(0);
            sysFile.setCreateTime(new Date());
        }

        sysFileDao.save(sysFile);
        Integer fileId = sysFile.getId();
        if (!fileId.equals(avatar)) {
            User u = userDao.get(userId);
            u.setAvatar(fileId);
            userDao.save(u);
        }
    }

    /**
     * 删除项目目录下的文件
     *
     * @param avatar
     */
    public void onDeleteFile(Integer avatar) {
        HttpServletRequest request = ServletUtils.getRequest();
        ServletContext servletContext = request.getSession().getServletContext();
        String sysFileDir = servletContext.getRealPath("/sysfile");
        String SEP = File.separator;// 可以检测是什么操作系统，主要防止linux系统的目录
        File file = new File(sysFileDir + SEP + avatar);
        deleteFiles(file);
    }

    /**
     * 递归删除图片文件
     *
     * @param file
     */
    public static void deleteFiles(File file) {

        if (file.isDirectory()) {
            // 如果是一个目录, 先查找这个目录下面的所有文件或目录
            // 再根据情况删除
            File[] files = file.listFiles();
            if (files.length == 0) {
                //如果是一个空目录,直接删除
                file.delete();
            } else {
                // 如果不是空目录, 则递归
                for (File f : files) {
                    deleteFiles(f);
                    // 递归删除完之后, 再把本目录删除
                    f.delete();
                }
            }
        } else {
            // 如果是一个文件,直接进行删除
            file.delete();
        }
    }


    @Autowired
    private UserDao userDao;
    @Autowired
    private SysFileDao sysFileDao;
    @Autowired
    private GeneralDao generalDao;
}
